import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

/**
 * L'environnement est l'espace de jeu de lequel vont evoluer les differents
 * animaux, salades, obstacles ...
 */
public class Environnement extends JFrame implements MouseListener,KeyListener{
   
    private int hauteurEnvironnement=768;
    private int largeurEnvironnement=1024;
    private int positionXSouris=this.getLargeurEnvironnement()/2;
    private int positionYSouris=this.getHauteurEnvironnement()/2;

    
    private ModeleDuJeu modele;
    private BarreDeJeu barreDeJeu = new BarreDeJeu(100,200,50,250,this);
    private MenuJeu menuJeu = new MenuJeu(this, barreDeJeu);
    
	private Dimension dimensionFenetrePrincipale = new Dimension(1024, 768);
    private JLayeredPane ensemble = new JLayeredPane();
	private PartieGagnee partieGagnee = new PartieGagnee(this, barreDeJeu);
	
    private Rectangle murHaut = new Rectangle(0,0,largeurEnvironnement,1);
    private Rectangle murBas = new Rectangle(0,hauteurEnvironnement,largeurEnvironnement,1);  
    private Rectangle murGauche = new Rectangle(0,0,1,hauteurEnvironnement);  
    private Rectangle murDroite = new Rectangle(largeurEnvironnement-1,0,1,hauteurEnvironnement); 

/**
 	* Generation de l'environnement de jeu, les etapes sont :
 	* <ul>
 	* <li>peinture du fond de l'environnement</li>
 	* <li>lancement d'un Thread 'threadPrincipal' qui toutes les 50 millisecondes recalcule le modele du jeu
 	* et repaint les elements graphiques</li>
 	* <li>modification de la fenetre princaple selon les criteres voulus</li>
 	* </ul>
 	*/
    public Environnement(){
    	super("Le Refuge des Escargots");
        this.modele = new ModeleDuJeu(this,barreDeJeu);
        final JPanel fond;
      	Color couleur = new Color(140,198,62);
      	fond = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                  super.paintComponent(g);
                 
               // Mettre en mouvement les escargots   
               modele.deplaceListeEscargot();
               // Mettre en mouvement les predateurs
               modele.deplaceListePredateur();
                  // affichage du modele du jeu
                  try {
					Thread.sleep(50);
                  } 
                  
                  catch (InterruptedException e) {
					e.printStackTrace();
				}
                  modele.affichage(g);
            }
      };
   
      	
    	fond.setBackground(couleur); 
		fond.setBounds(0, 0, 1024, 768);
		fond.addMouseListener(this);
		addKeyListener(this);
		ensemble.add(fond, new Integer(2));
		
		Thread threadPrincipal = new Thread(new Runnable() {
            @Override
            public void run() {
                  while (true) { // boucle infinie   
                	  modele.calcul();
                	  fond.repaint();
           
                	// temporisation
                      try {
                            Thread.sleep(50);
                      }
                      
                      catch (InterruptedException e) {
                      }
                  }
            }
		});
		
		// lancer le thread principal
		threadPrincipal.start();
			    
		setContentPane(ensemble);
		this.setUndecorated(true);

    	this.setPreferredSize(dimensionFenetrePrincipale);
    	this.setResizable(false);
    	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.pack();
		this.setLocationRelativeTo(null);
		this.setVisible(true);	
		
		
    }


/**
 	* Gestion de la souris dans l'environnement de jeu
 	*/
    @Override
	public void mouseClicked(MouseEvent e) {
    	this.setPositionXSouris(e.getX());
    	this.setPositionYSouris(e.getY());
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		
	}


	@Override
	public void mouseExited(MouseEvent e) {
		
	}


	@Override
	public void mousePressed(MouseEvent e) {
				
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		
	}

/**
 	* Gestion du clavier
 	*/
	@Override
	public void keyPressed(KeyEvent c) {
		int keyCode = c.getKeyCode();
		if (keyCode == KeyEvent.VK_ESCAPE) {
			MenuJeu menuJeu = new MenuJeu(this,barreDeJeu);
			menuJeu.setVisible(true);
		}
	}


	@Override
	public void keyReleased(KeyEvent arg0) {
	}


	@Override
	public void keyTyped(KeyEvent arg0) {
	}

/**
 	* Accesseurs et mutateurs
 	*/
	
	public int getPositionXSouris() {
		return positionXSouris;
	}


	public int getHauteurEnvironnement() {
		return hauteurEnvironnement;
	}


	public void setHauteurEnvironnement(int hauteurEnvironnement) {
		this.hauteurEnvironnement = hauteurEnvironnement;
	}

	public int getLargeurEnvironnement() {
		return largeurEnvironnement;
	}

	public void setLargeurEnvironnement(int largeurEnvironnement) {
		this.largeurEnvironnement = largeurEnvironnement;
	}

	public void setPositionXSouris(int positionXSouris) {
		this.positionXSouris = positionXSouris;
	}

	public int getPositionYSouris() {
		return positionYSouris;
	}

	public void setPositionYSouris(int positionYSouris) {
		this.positionYSouris = positionYSouris;
	}
	
	public Rectangle getMurHaut() {
		return murHaut;
	}


	public Rectangle getMurBas() {
		return murBas;
	}


	public Rectangle getMurGauche() {
		return murGauche;
	}


	public Rectangle getMurDroite() {
		return murDroite;
	}	
	
	public PartieGagnee getPartieGagnee() {
		return partieGagnee;
	}
	
	public void finDePartie() {
		if(this.partieGagnee.isPartieTerminee() & partieGagnee.isVisible()==false 
				& partieGagnee.isPartieContinue()==false) {
			this.partieGagnee.setVisible(true);
		}
	}


	public ModeleDuJeu getModele() {
		return modele;
	}
}
